package org.example.springboot.controller;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.example.springboot.response.PaginationResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
public abstract class BaseController<Service extends ServiceImpl<? extends BaseMapper<Entity>, Entity>, Entity> {
  @Autowired
  protected Service baseService;
  protected final int DEFAULT_PAGE_SIZE = 10;

  /**
   * 查询所有的entity对象
   *
   * @return 所有的entity对象
   */
  @GetMapping("/queryAll")
  public List<Entity> queryAll() {
    return baseService.list();
  }

  /**
   * 根据id查询entity对象
   *
   * @param id 希望查询的id
   * @return 对应的entity对象
   */
  @GetMapping("/queryById")
  public Entity queryById(Integer id) {
    return baseService.getById(id);
  }

  /**
   * 查询所有entity对象（分页）
   *
   * @param pageNumber 分页数目
   * @return 分页后的对象
   */
  @GetMapping("/queryAll/{pageNumber}")
  public PaginationResponse<List<Entity>> queryAllPagination(@PathVariable Integer pageNumber) {
    IPage<Entity> page = new Page<>(pageNumber, DEFAULT_PAGE_SIZE);
    baseService.list(page, null);
    return new PaginationResponse<>(page.getTotal(), page.getRecords());
  }

  /**
   * 更新所有的entity对象
   *
   * @return 更新结果
   */
  @PutMapping("/update")
  public boolean update(@RequestBody Entity entity) {
    return baseService.updateById(entity);
  }

  /**
   * 删除指定的entity对象
   *
   * @param id 希望删除的id
   * @return 删除结果
   */
  @DeleteMapping("/delete")
  public boolean delete(long id) {
    return baseService.removeById(id);
  }

  /**
   * 删除指定的entity对象
   *
   * @param ids 希望删除的ids
   * @return 删除结果
   */
  @DeleteMapping("/deleteSome")
  public boolean deleteSome(List<Long> ids) {
    return baseService.removeByIds(ids);
  }

  /**
   * 添加所有的entity对象
   *
   * @param entity 添加的对象
   * @return 添加结果
   */
  @PostMapping("/add")
  public boolean add(@RequestBody Entity entity) {
    return baseService.save(entity);
  }

  /**
   * 添加指定的entity对象
   *
   * @param entities 添加的对象
   * @return 添加结果
   */
  @PostMapping("/addAll")
  public boolean addAll(@RequestBody List<Entity> entities) {
    return baseService.saveBatch(entities);
  }
}
